今天要來講 繼承 這個類別,其實就跟他名字一樣他是 Class 裡面的一個特性,可以繼承其他 Class 的一個方法。
不是繼承的 Class 通成為 基類(Base Class)
來看一下官方的例子
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// 不做任何事
}
}
定義好了一個, Vehicle 的 Base Class 。
那我們用初始化語法來實例 Vehicle
let someVehicle = Vhicle()
現在已經實例化了一個 Vehicle 那可以來訪問他的 description 並輸出現階段的數值。
print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour
生成 Subclass 就是在已有的 Class 上創建一個新的 Class 但他也會有原本 Class 的屬性但可以新增新的東西來完善它。
class SomeClass: SomeSuperclass {
// SubClass 定義
}
下面的官方例子沿用前面的 Base Class 做的例子
class Bicycle: Vehicle {
var hasBasket = false
}
就跟上面一樣,實例了 Bicycle 就可以修改裡面的東西,當然也包含他繼承的 Vehicle
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour
一個 Subclass 可以給繼承來的 Class 裡面原有的方法提供自己的改寫。我們都叫做 overriding 。
依照前面的 Base Class 來寫下面的例子
class Train: Vehicle {
ovrride func makeNoise() {
print("Choo Choo")
}
}
後面調用之後就會有更改後的效果
let train = Train()
train.makeNoise()
// Choo Choo
可以重寫繼承來的實力屬性,也可以提供訂製的 getter 或 setter 來重寫任何繼承來的屬性。
看下面官方的例子,繼續沿用 Vehicle 這個例子
class Car: Vehicle {
var gear = 1
override var description: Sting {
return super.description + "in gear \(gear)"
}
}
重寫 description 要調用 super.description 先讓他拿到 Vehicle 原始的 description 屬性,之後再寫 Car Class 版本的 description
之後調用起來就會像下面
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// Car: traveling at 25.0 miles per hour in gear 3
你可以通過重寫屬性來為繼承來的屬性添加一個觀察器,如果屬性值被更改的時候就會得到通知。
我們來看官方的例子
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
依舊延續前面的例子,那調用出來後會像下面這樣。
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4
他裡面改變了 currentSpeed 所以他會做 gear = Int(currentSpeed / 10.0) + 1 這個方法。
如果要防止重寫被更改的話,只要在前面加上 final 就可以了。
final var , final func , final class 依此類推。
今天就到這裡,感謝各位。